﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// NotReviewedButNeeded
#pragma once
#include "GcmpModel.h"
#include <string>

namespace gcmp
{
    class IDocument;

    /// \brief UserTransactionGroupUtils
    ///
    /// 用户事务组工具
    class GCMP_MODEL_EXPORT UserTransactionGroupUtils
    {
    public:
        /// \brief 启动事务组
        ///
        /// \param [in] pDoc 文档指针
        /// \param [in] name 将要启动的事务组名字
        /// \param [out] groupId 如果启动成功，返回事务组Id。
        /// \return bool 是否启动成功
        static bool Start(IDocument* pDoc, const std::wstring& name, int & groupId);

        /// \brief 提交指定事务组
        ///
        /// \param [in] pDoc 文档指针
        /// \param [in] groupId 将要提交的事务组Id
        /// \return bool 是否提交成功
        static bool Commit(IDocument* pDoc, int groupId);

        /// \brief 终止指定事务组
        /// \param [in] pDoc 文档指针
        /// \param [in] groupId 将要终止的事务组Id
        /// \return bool 是否终止成功
        static bool Abort(IDocument* pDoc, int groupId);

        /// \brief 提交活动的事务组中的最新一个
        ///
        /// 如果有其它活动事务组，最新的这个活动事务组是其它活动事务组的子事务组
        /// \param [in] pDoc 文档指针
        /// \return bool 是否提交成功
        static bool CommitLatestActive(IDocument* pDoc);

        /// \brief 提交活动的事务组中的最新一个，并将事务组中的所有事务合并成一个
        ///
        /// 如果有其它活动事务组，最新的这个活动事务组是其它活动事务组的子事务组
        /// \param [in] pDoc 文档指针
        /// \return bool 是否提交成功
        static bool CommitLatestActiveWithTransactionsMergedIntoOne(IDocument* pDoc);

        /// \brief 终止活动的事务组中的最晚一个
        ///
        /// 即当前活动事务组，是所有活动事务组的最晚后代。
        /// \param [in] pDoc 文档指针
        /// \return bool 是否终止成功
        static bool AbortLatestActive(IDocument* pDoc);

        /// \brief 是否在事务组中
        /// 
        /// 是否在活动事务组中
        /// \param [out] groupId 所在事务组Id
        /// \param [out] groupName 所在事务组名字
        /// \return true 在活动事务组中
        static bool IsInActive(const IDocument* pDoc, int & groupId, std::wstring& groupName);

        /// \brief 获取最早的活动事务组Id
        ///
        /// 和LastestActive对应，这个事务组是所有活动事务组的最早祖先。
        /// \param [in] pDoc 文档指针
        /// \return int 事务组Id
        /// \see GetLatestActive()
        static int GetEarliestActive(const IDocument* pDoc);

        /// \brief 获取最晚的活动事务组Id
        ///
        /// 和EarliestActive对应，这个事务组是所有活动事务组的最晚后代。
        /// \param [in] pDoc 文档指针
        /// \return int 事务组Id
        /// \see GetEarliestActive()
        static int GetLatestActive(const IDocument* pDoc);
    };
}

